//Protocol.hpp
#pragma once

#include <iostream>
#include <string>
#include <jsoncpp/json/json.h>

using namespace std;

// 定制协议的过程，目前就是定制结构化数据的过程
// 请求格式
// 我们自己定义的协议，client && server 都必须遵守! 这就叫做自定义协议
typedef struct request   //请求格式
{
    int x;  //10
    int y;  //0
    char op; // '/'      "+-*/%"
} request_t; //10/0 ->除0错误

// 响应格式
typedef struct response 
{
    int result; // 计算结果， 能否区分是正常的计算结果，还是异常的退出结果 ->不能
    int code;   // 表示server运算完毕的计算状态: code为0表示success), code为-1表示div 0 ...

    //所以拿到退出结果的时候,需要先检查code的值
}response_t;


//序列化请求
//序列化的函数:结构化的数据->字符串
//request_t -> string   
std::string SerializeRequest(const request_t &req)
{
    // 序列化的过程
    Json::Value root; //可以承装任何对象， json是一种kv式的序列化方案
    root["datax"] = req.x;
    root["datay"] = req.y;
    root["operator"] = req.op;

    Json::FastWriter writer;
    std::string json_string = writer.write(root);
    return json_string;
}

//反序列化请求
//反序列化的函数:字符串->结构化的数据
// string -> request_t
void DeserializeRequest(const std::string &json_string, request_t &out) //输出型参数out
{
    //反序列化
    Json::Reader reader;
    Json::Value root;

    reader.parse(json_string, root);
    //输出型参数    
    out.x = root["datax"].asInt();
    out.y = root["datay"].asInt();
    out.op = (char)root["operator"].asInt();
}

//序列化响应
std::string SerializeResponse(const response_t &resp)
{
    Json::Value root;
    root["code"] = resp.code;
    root["result"] = resp.result;

    Json::FastWriter writer;
    std::string res = writer.write(root);

    return res;
}

//反序列化响应
void DeserializeResponse(const std::string &json_string, response_t &out)
{
    //反序列化  
    Json::Reader reader;
    Json::Value root;

    reader.parse(json_string, root);
    out.code = root["code"].asInt();
    out.result = root["result"].asInt();
}